package ch.elexis.core.findings.fhir.po.dataaccess; import java.time.LocalDate; import java.time.Month; import java.util.ArrayList; import java.util.List; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.data.interfaces.IDataAccess; import ch.elexis.core.findings.ICondition; import ch.elexis.core.findings.ICondition.ConditionCategory; import ch.elexis.core.findings.IFinding; import ch.elexis.core.findings.IFindingsService; import ch.elexis.core.findings.codes.ICodingService; import ch.elexis.data.Patient; import ch.elexis.data.PersistentObject; import ch.rgw.tools.Result; public class FindingsDataAccessor implements IDataAccess { private static final String FINDINGS_PATIENT_DIAGNOSIS = "Patient Diagnosen"; private IFindingsService findingsService; private ICodingService codingService; ArrayList<Element> elementsList; private Element[] elements = { new Element(IDataAccess.TYPE.STRING, FINDINGS_PATIENT_DIAGNOSIS, "[Befunde:-:-:" + FINDINGS_PATIENT_DIAGNOSIS + "]", null, 0) }; public FindingsDataAccessor(){ // initialize the list of defined elements elementsList = new ArrayList<Element>(); for (int i = 0; i < elements.length; i++) { elementsList.add(elements[i]); } // initialize the findings service references findingsService = (IFindingsService) getService(IFindingsService.class); codingService = (ICodingService) getService(ICodingService.class); } private Object getService(Class<?> clazz){ // use osgi service reference to get the service BundleContext context = FrameworkUtil.getBundle(FindingsDataAccessor.class).getBundleContext(); if (context != null) { ServiceReference<?> serviceReference = context.getServiceReference(clazz.getName()); if (serviceReference != null) { return context.getService(serviceReference); } } return null; } @Override public String getName(){ return "Befunde strukturiert"; } @Override public String getDescription(){ return "Befunde strukturiert"; } @Override public List<Element> getList(){ return elementsList; } @Override public Result<Object> getObject(String descriptor, PersistentObject dependentObject, String dates, String[] params){ Result<Object> result = new Result<Object>(""); Patient patient = (Patient) ElexisEventDispatcher.getSelected(Patient.class); if (patient != null) { if (descriptor.equalsIgnoreCase(FINDINGS_PATIENT_DIAGNOSIS)) { List<IFinding> findings = findingsService.getPatientsFindings(patient.getId(), ICondition.class); List<ICondition> conditions = getDiagnosis(findings); StringBuilder sb = new StringBuilder(); conditions.stream().forEach(condition -> { if (sb.length() > 0) { sb.append("\n"); } sb.append(TextUtil.getText(condition, codingService)); }); result = new Result<Object>(sb.toString()); } } return result; } private List<ICondition> getDiagnosis(List<IFinding> findings){ List<ICondition> ret = new ArrayList<>(); findings.stream().forEach(finding -> { if (finding instanceof ICondition) { ICondition iCondition = (ICondition) finding; if (iCondition.getCategory().equals(ConditionCategory.DIAGNOSIS)) { ret.add(iCondition); } } }); ret.sort((left, right) -> { LocalDate lRecorded = left.getDateRecorded().orElse(LocalDate.of(1970, Month.JANUARY, 1)); LocalDate rRecorded = right.getDateRecorded().orElse(LocalDate.of(1970, Month.JANUARY, 1)); return rRecorded.compareTo(lRecorded); }); return ret; } }